# -*- coding: utf-8 -*-
"""
金桔王权限校验节点
根据用户身份、聊天环境和意图类型，验证用户是否有权限执行相应操作
"""
import traceback
from typing import Dict, Any, Set
from common.log import logger
from common.enum_types import IntentionType, ActionType
from .workflow_utils import WorkflowState


class PermissionChecker:
    """权限检查器"""
    
    # 敏感指令 - 需要特殊权限或私聊环境
    SENSITIVE_INSTRUCTIONS: Set[str] = {
        IntentionType.MANAGE_USER.value,        # 用户管理
        IntentionType.REPORT_ORDERS.value,      # 订单报告
        IntentionType.CHECK_MY_ORDERS.value,    # 查看个人订单
        IntentionType.CHECK_MY_KUMQUATS.value,  # 查看个人金桔
        IntentionType.KUMQUAT_MANAGE.value      # 金桔管理
    }
    
    # 需要私聊的指令
    PRIVATE_ONLY_INSTRUCTIONS: Set[str] = {
        IntentionType.MANAGE_USER.value,        # 用户管理必须私聊
        IntentionType.REPORT_ORDERS.value,      # 订单报告必须私聊
        IntentionType.CHECK_MY_ORDERS.value,    # 查看个人订单必须私聊
        IntentionType.CHECK_MY_KUMQUATS.value   # 查看个人金桔必须私聊
    }
    
    # 管理员权限指令集合
    ADMIN_ONLY_INSTRUCTIONS: Set[str] = {
        IntentionType.REPORT_ORDERS.value,      # 订单报告
        IntentionType.KUMQUAT_MANAGE.value      # 金桔管理
    }
    
    # 需要注册用户的指令
    REGISTERED_USER_INSTRUCTIONS: Set[str] = {
        IntentionType.MANAGE_MY_ORDER.value,    # 管理个人订单
        IntentionType.REPORT_TODAY.value,       # 汇报今日订单
        IntentionType.CHECK_MY_ORDERS.value,    # 查看个人订单
        IntentionType.CHECK_MY_KUMQUATS.value   # 查看个人金桔
    }

    @staticmethod
    def check_permission(state: WorkflowState) -> tuple[bool, str]:
        """
        检查用户权限
        
        Args:
            state: 工作流状态
            
        Returns:
            (是否有权限, 错误消息)
        """
        intention = state.get("intention")
        user = state.get("user")
        is_group_chat = state.get("is_group_chat", False)
        
        logger.info(f"[权限校验] 🔐 检查权限 - 意图: {intention}, 用户: {user.nickname if user else '未知'}, 群聊: {is_group_chat}")
        
        # 检查是否需要私聊
        if intention in PermissionChecker.PRIVATE_ONLY_INSTRUCTIONS and is_group_chat:
            return False, f"🔒 该功能需要私聊使用，请私信我进行操作"
        
        # 检查是否需要注册用户
        if intention in PermissionChecker.REGISTERED_USER_INSTRUCTIONS:
            if not user or user.role == "ANONYMOUS":
                return False, f"🚫 该功能需要注册用户才能使用，请先注册"
        
        # 检查管理员权限
        if intention in PermissionChecker.ADMIN_ONLY_INSTRUCTIONS:
            if not user or user.role not in ["ADMIN", "MANAGER"]:
                return False, f"🛡️ 该功能需要管理员权限"
        
        # 基础指令，无需特殊权限
        basic_instructions = {
            IntentionType.HELP.value, 
            IntentionType.BAVARDER.value, 
            IntentionType.KUMQUAT_INFO.value, 
            IntentionType.EMPTY_INSTRUCTION.value
        }
        if intention in basic_instructions:
            return True, ""
        
        # 其他指令默认允许
        return True, ""


def permission_validation_node(state: WorkflowState) -> dict:
    """
    权限校验节点
    
    Args:
        state: 工作流状态
        
    Returns:
        更新后的状态字典
    """
    try:
        logger.debug(f"[权限校验] 🔐 开始权限校验")
        
        # 从状态中获取chat_handler
        chat_handler = state.get("chat_handler")
        
        # 执行权限检查
        has_permission, error_message = PermissionChecker.check_permission(state)
        
        if has_permission:
            logger.debug(f"[权限校验] ✅ 权限验证通过")
            
            # 记录权限验证通过
            if chat_handler:
                chat_handler.add_action(ActionType.PERMISSION_GRANTED.value)
            return {
                "permission_granted": True
            }
        else:
            logger.warning(f"[权限校验] ❌ 权限不足: {error_message}")
            # 记录权限验证失败
            if chat_handler:
                chat_handler.add_action(ActionType.PERMISSION_DENIED.value)
                chat_handler.note = f"权限不足: {error_message}"
            return {
                "permission_granted": False,
                "error_message": error_message,
                "final_response": error_message
            }
            
    except Exception as e:
        # 记录权限验证异常
        chat_handler = state.get("chat_handler")
        if chat_handler:
            chat_handler.add_action("PERMISSION_ERROR")
            chat_handler.set_note(f"权限验证异常: {str(e)}")
        
        logger.error(f"[权限校验] ❌ 处理异常: {e} - {traceback.format_exc()}")
        return {
            "permission_granted": False,
            "error_message": f"权限校验失败: {str(e)}",
            "final_response": "系统权限校验异常，请稍后重试"
        }